package io.gitee.terralian.commons.entity;

import lombok.Data;

/**
 * 简单的统一响应模版定义，使用{@link #success}判定是否成功
 *
 * @param <T> 数据类型
 */
@Data
public class R<T> {
    /**
     * 是否成功
     */
    private boolean success;
    /**
     * 消息
     */
    private String msg;
    /**
     * 数据
     */
    private T data;

    /**
     * 返回成功的消息
     *
     * @param data 响应数据
     * @param <T> 数据类型
     */
    public static <T> R<T> success(T data) {
        return success(null, data);
    }

    /**
     * 返回成功的消息，其中数据为空
     *
     * @param msg 消息
     * @param <T> 数据类型
     */
    public static <T> R<T> successEmpty(String msg) {
        return success(msg, null);
    }

    /**
     * 返回成功的消息
     *
     * @param msg 消息
     * @param data 响应数据
     * @param <T> 数据类型
     */
    public static <T> R<T> success(String msg, T data) {
        return build(true, msg, data);
    }

    /**
     * 返回失败的消息
     *
     * @param data 响应数据
     * @param <T> 数据类型
     */
    public static <T> R<T> error(T data) {
        return error(null, data);
    }

    /**
     * 返回失败的消息，其中数据为空
     *
     * @param msg 消息
     * @param <T> 数据类型
     */
    public static <T> R<T> errorEmpty(String msg) {
        return error(msg, null);
    }

    /**
     * 返回失败的消息
     *
     * @param msg 消息
     * @param data 响应数据
     * @param <T> 数据类型
     */
    public static <T> R<T> error(String msg, T data) {
        return build(false, msg, data);
    }

    /**
     * 返回成功的消息
     *
     * @param msg 消息
     * @param data 响应数据
     * @param <T> 数据类型
     */
    private static <T> R<T> build(boolean success, String msg, T data) {
        R<T> res = new R<>();
        res.success = success;
        res.data = data;
        res.msg = msg;
        return res;
    }
}
